#include "pantalla.h"

#include <SDL/SDL.h>
#include <SDL/SDL_image.h>
#include <SDL/SDL_ttf.h>

// Variables globales
SDL_Surface *grid,*fondo,*j_rojo,*j_azul,*text;
TTF_Font *font,*font2,*font3;
Uint8 *keys;
int done = 0;

// Thread
void* thread_pantalla(void* arg)
{
	SDL_Rect dest;
	int ret=-1;
	
	// Señal para actualizar
	signal(SIGUSR1,handler);
	
	// Funcion inicializacion
	cargar();
		
	// Colores
	SDL_Color rojo = {255,0,0};
	SDL_Color verde = {0,255,0};
	SDL_Color azul = {0,0,255};
	
	// Funcion presentacion
	presentacion();
	
	// Desplazamiento (x,y,ancho_imagen,altura_imagen)
	dest.x = 0;
	dest.y = 0;
	dest.w = fondo -> w;
	dest.h = fondo -> h;
	
	// Mandar fondo a pantalla
	SDL_BlitSurface(fondo, NULL, screen, &dest);
	
	// Desplazamiento (x,y,ancho_imagen,altura_imagen)
	dest.x = GRID_POSX;
	dest.y = GRID_POSY;
	dest.w = grid -> w;
	dest.h = grid -> h;
	
	// Mando grilla a pantalla
	SDL_BlitSurface(grid, NULL, screen, &dest);
	
	// Actualizar pantalla
	SDL_Flip(screen);
	
	// Libera superficie
	SDL_FreeSurface(fondo);
	
	while(1)
	{
		pause();
		
		//text = TTF_RenderText_Solid(font,"Courier 12",verde);
		
		// Coordenadas
		dest.x = s_mov.posx;
		dest.y = s_mov.posy;
				
		// Mandar imagen circulo a pantalla
		if(s_mov == ESFERA)
			SDL_BlitSurface(j_rojo, NULL, screen, &dest);
		else
			SDL_BlitSurface(j_azul, NULL, screen, &dest);
		
		// Mandar imagen texto a pantalla
		//SDL_BlitSurface(text, NULL, screen, &dest);					
		SDL_Flip(screen);
	}
}

// Funciones secundarias
void start_sdl()
{
	atexit(SDL_Quit);

	// Iniciar SDL
	if(SDL_Init(SDL_INIT_VIDEO) < 0)
	{
	    printf("No se ha podido iniciar SDL: %s\n", SDL_GetError());
	    exit(1);
	}
	
	// Modo de video
	screen = SDL_SetVideoMode(WIDTH, HEIGHT, BPP, SDL_HWSURFACE);
	if(screen == NULL)
	{
	    printf("No se ha podido establecer el modo de vídeo: %s\n", SDL_GetError());
	    exit(1);
	}	
}

void cargar()
{
	// Carga imagenes
	fondo = IMG_Load("recursos/img/fondo.bmp");
	if(fondo == NULL)
	{
	    printf("No se ha podido cargar la imagen fondo: %s\n", SDL_GetError());
	    exit(1);
	}
	
	grid = IMG_Load("recursos/img/grid.png");
	if(grid == NULL)
	{
	    printf("No se ha podido cargar la imagen grid: %s\n", SDL_GetError());
	    exit(1);
	}
	
	j_rojo = IMG_Load("recursos/img/rojo3d.png");
	if(j_rojo == NULL)
	{
	    printf("No se ha podido cargar la imagen: %s\n", SDL_GetError());
	    exit(1);
	}
	
	j_azul = IMG_Load("recursos/img/cubo3d.png");
	if(j_azul == NULL)
	{
	    printf("No se ha podido cargar la imagen: %s\n", SDL_GetError());
	    exit(1);
	}
	
	// Para establecer transparencia de fucsia (255,0,255)
	//if(SDL_SetColorKey(image2, SDL_SRCCOLORKEY, SDL_MapRGB(image2->format,255,0,255)) == -1)
	//{
	//    printf("Error transparencia: %s\n", SDL_GetError());
	//    exit(1);
	//}	
	
	// Inicio y cargo fonts
	TTF_Init();
	font = TTF_OpenFont("recursos/fonts/Quantum.ttf",32);
	if(font == NULL)
	{
		printf("Error font: %s\n",TTF_GetError());
		exit(1);
	}	
}

void presentacion()
{
	SDL_Rect data;
	SDL_Color verde = {0,255,0};
	
	text = TTF_RenderText_Solid(font,"TaTeTi Tournament",verde);

	// Hago fundido del texto de presentacion
	fundido(text,(WIDTH/2)-(text->w/2),(HEIGHT/2),3,verde);
	
	sleep(2);
	limpiar_screen();
}

void limpiar_screen()
{
	// Pinto la pantalla de negro
	SDL_FillRect(screen, NULL, 0);
}

void fundido(SDL_Surface *img, short x, short y, short lvl, SDL_Color color)
{
	// Realiza transparencias de la imagen pasada por parametro
	// X e Y: posicion deseada de imagen
	// lvl: nivel de transparencias
	// color: color de texto, 0 para imagen
	
	SDL_Rect data;
	short i=0, alpha_max=255, alpha=0;
	
	// Coordenadas
	data.w = img -> w;
	data.h = img -> h;
	
	for(i=lvl;i>=0;i--)
	{
		if( x+i <= WIDTH && y+i <= HEIGHT)
		{
			if(i == 0)
				alpha = 0;
			else
				alpha = alpha_max - alpha_max/i;
				
			// Para establecer transparencia de toda la imagen
			SDL_SetAlpha(img,SDL_SRCALPHA|SDL_RLEACCEL,alpha);
			data.x = x + i;
			data.y = y + i ;
			
			SDL_BlitSurface(img, NULL, screen, &data);
			SDL_Flip(screen);
		}
	}
}

void handler(int sig)
{
	return;
}
